package br.usp.ime.protoc.pessoa;

import java.util.HashSet;
import java.util.Iterator;

import br.usp.ime.protoc.fujaba.FEmptyIterator;

public class Parente
extends Pessoa
{
   /**
    * <pre>
    *          0..*     has     1..* 
    * Parente ----------------------- Paciente
    *          parente      paciente 
    * </pre>
    */
   private HashSet paciente;

   public boolean addToPaciente(Paciente value)
   {
      boolean changed = false;
      if (value != null)
      {
         if (this.paciente == null)
         {
            this.paciente = new HashSet (); // or FTreeSet () or FLinkedList ()
         }
         
         changed = this.paciente.add (value);
         if (changed)
         {
            value.addToParente (this);
         }
         
      }
      return changed;
   }

   public boolean hasInPaciente(Paciente value)
   {
      return ((this.paciente != null) &&
              (value != null) &&
              this.paciente.contains (value));
   }

   public Iterator iteratorOfPaciente()
   {
      return ((this.paciente == null)
              ? FEmptyIterator.get ()
              : this.paciente.iterator ());
   }

   public void removeAllFromPaciente()
   {
      Paciente tmpValue;
      Iterator iter = this.iteratorOfPaciente ();
      while (iter.hasNext ())
      {
         tmpValue = (Paciente) iter.next ();
         this.removeFromPaciente (tmpValue);
      }
   }

   public boolean removeFromPaciente(Paciente value)
   {
      boolean changed = false;
      if ((this.paciente != null) && (value != null))
      {
         
         changed = this.paciente.remove (value);
         if (changed)
         {
            value.removeFromParente (this);
         }
         
      }
      return changed;
   }

   public int sizeOfPaciente()
   {
      return ((this.paciente == null)
              ? 0
              : this.paciente.size ());
   }

   /**
    * <pre>
    *          0..*       has        1 
    * Parente ------------------------- Parentesco
    *          parente      parentesco 
    * </pre>
    */
   private Parentesco parentesco;

   public Parentesco getParentesco()
   {
      return this.parentesco;
   }

   public boolean setParentesco(Parentesco value)
   {
      boolean changed = false;
      if (this.parentesco != value)
      {
         Parentesco oldValue = this.parentesco;
         
         if (this.parentesco != null)
         {
            this.parentesco = null;
            oldValue.removeFromParente (this);
         }
         this.parentesco = value;
         if (value != null)
         {
            value.addToParente (this);
         }
         changed = true;
         
      }
      return changed;
   }

   public void removeYou()
   {
      removeAllFromPaciente ();
      Parentesco tmpParentesco = getParentesco ();
      if (tmpParentesco != null)
      {
         setParentesco (null);
      }
      super.removeYou ();
   }

}
